// 导入axios模块
import axios from 'axios'
import { Promise } from 'core-js'

// 导入 store 模块
import store from '@/store'

// 导入 message 消息提示函数
import { Message } from 'element-ui'

// 导入 router 实例
import router from '@/router'

// 创建 axios 实例
const request = axios.create({
  // 请求基地址
  /**
   * 同源：协议、域名、端口都一致
   * 跨域：协议、域名、端口只要有一个不一致
   */
  baseURL: process.env.VUE_APP_BASE_API,
  // 请求超时时间，5s
  timeout: 5000
})

// 添加请求拦截器
request.interceptors.request.use(config => {
  // 在发送请求之前做些什么
  // 从 vuex 中获取token
  const { token } = store.state.user
  if (token) { // 如果有token
    // 通过请求头携带给后台，给 headers 添加 Authorization
    config.headers.Authorization = `Bearer ${token}`
  }
  return config
}, (error) => {
  // 对请求错误做些什么
  return Promise.reject(error)
})

// 添加响应拦截器
request.interceptors.response.use(response => {
  // 对响应数据做点什么(剥离data)
  // 解构
  const { data } = response
  // 判断data.success的值
  if (data.success) { // 请求成功
    // 直接返回data对象
    return data
  }
  // 请求失败，返回一个失败态的Promise实例
  return Promise.reject(data)
}, async(err) => {
  // 判断 token 过期状态码
  console.log(666)
  console.dir(err)
  if (err.response.status === 401 && err.response.data.code === 10002) {
    console.log(777)
    // 给出token过期提示
    Message.error('登录过期，请重新登录')
    // 清空vuex中的token和用户信息
    await store.dispatch('user/logoutAction')
    // 跳转至登录，并携带回跳地址
    router.replace(`/login?redirectUrl=${router.currentRoute.fullPath}`)
  }
  return Promise.reject(err)
})

// 导出 request 实例
export default request
